package persistance.dal;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import ucc.objects.ClasseDeProduitDTO;
import ucc.objects.ProduitDTO;
import ucc.request.UccViewer;
import biz.BizFactory;

public class StockFinderImpl implements ProduitFinder {

	private PreparedStatement q1;
	private PreparedStatement q2;
	private PreparedStatement q3;
	private final String Q1 = "select * from caisse.produits";
	private final String Q2 = "select * from caisse.produits where actif=?";
	private final String Q3 = "select * from caisse.produits where id_produit=?";

	public StockFinderImpl() {
		this.q1 = DalBackEndServices.INSTANCE.prepare(Q1);
		this.q2 = DalBackEndServices.INSTANCE.prepare(Q2);
		this.q3 = DalBackEndServices.INSTANCE.prepare(Q3);
	}

	public ArrayList<ProduitDTO> lesProduits() {
		ResultSet rs = null;
		ArrayList<ProduitDTO> listeProduits = new ArrayList<ProduitDTO>();
		try {
			rs = q1.executeQuery();
			while (rs.next()) {
				ProduitDTO produit = BizFactory.INSTANCE
						.createEmptyProduitDTO();

				produit.setId(rs.getInt("id_produit"));
				produit.setMarque(rs.getString("marque"));
				produit.setNom(rs.getString("nom"));
				produit.setContenance(UccViewer.INSTANCE.laContenanceNum(rs
						.getInt("id_contenance")));
				produit.setPrixDeVente(rs.getDouble("prix_vente"));
				produit.setTypeDeProduit(UccViewer.INSTANCE
						.leTypeDeProduitNum(rs.getInt("id_type_de_produit")));
				produit.setClasseDeProduit(UccViewer.INSTANCE
						.laClasseDeProduitNum(rs.getInt("id_classe_de_produit")));
				produit.setActif(rs.getBoolean("actif"));

				listeProduits.add(produit);
			}
			return listeProduits;
		} catch (SQLException e) {
			System.out.println("[E][SQL] : ");
			e.printStackTrace();
		}
		return null;
	}

	public ArrayList<ProduitDTO> lesProduits(boolean actif) {
		ResultSet rs = null;
		ArrayList<ProduitDTO> listeProduits = new ArrayList<ProduitDTO>();
		try {
			q2.setBoolean(1, actif);
			rs = q2.executeQuery();
			while (rs.next()) {
				ProduitDTO produit = BizFactory.INSTANCE
						.createEmptyProduitDTO();

				produit.setId(rs.getInt("id_produit"));
				produit.setMarque(rs.getString("marque"));
				produit.setNom(rs.getString("nom"));
				produit.setContenance(UccViewer.INSTANCE.laContenanceNum(rs
						.getInt("id_contenance")));
				produit.setPrixDeVente(rs.getDouble("prix_vente"));
				produit.setTypeDeProduit(UccViewer.INSTANCE
						.leTypeDeProduitNum(rs.getInt("id_type_de_produit")));
				produit.setClasseDeProduit(UccViewer.INSTANCE
						.laClasseDeProduitNum(rs.getInt("id_classe_de_produit")));
				produit.setActif(actif);

				listeProduits.add(produit);
			}
			return listeProduits;
		} catch (SQLException e) {
			System.out.println("[E][SQL] : ");
			e.printStackTrace();
		}
		return null;
	}

	public ProduitDTO leProduitNum(int id) {
		ResultSet rs = null;
		ProduitDTO produit = BizFactory.INSTANCE.createEmptyProduitDTO();
		try {
			q3.setInt(1, id);
			rs = q3.executeQuery();
			while (rs.next()) {
				produit.setId(id);
				produit.setMarque(rs.getString("marque"));
				produit.setNom(rs.getString("nom"));
				produit.setContenance(UccViewer.INSTANCE.laContenanceNum(rs
						.getInt("id_contenance")));
				produit.setPrixDeVente(rs.getDouble("prix_vente"));
				produit.setTypeDeProduit(UccViewer.INSTANCE
						.leTypeDeProduitNum(rs.getInt("id_type_de_produit")));
				produit.setClasseDeProduit(UccViewer.INSTANCE
						.laClasseDeProduitNum(rs.getInt("id_classe_de_produit")));
				produit.setActif(rs.getBoolean("actif"));
			}
			return produit;
		} catch (SQLException e) {
			System.out.println("[E][SQL] : ");
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public ArrayList<ProduitDTO> lesProduitsDeLaClasse(
			ClasseDeProduitDTO classeDeProduit, boolean actif) {
		// TODO Auto-generated method stub
		return null;
	}
}
